package com.ll.custom;

import java.util.ArrayList;

/**
 * @author 刘龙
 * @version 1.0
 * 泛型方法的使用
 */
public class CustomMethodGeneric {
    public static void main(String[] args) {
        Car car = new Car();
        // 当调用方法, 传入参数, 编译器, 就会确认类型
        // 输出
        // class java.lang.String
        // class java.lang.Integer
        car.fly("宝马", 100);

        Fish<String, ArrayList> fish = new Fish<>();
        // 输出
        // class java.lang.String
        // class java.lang.Integer
        // class java.util.ArrayList
        fish.hello("金龙鱼", 1, new ArrayList());
    }
}
/**
 * 泛型方法,可以定义在普通类中,也可以定义在泛型类中
 */
class Car {
    /**
     * 普通方法
     */
    public void run(){}

    /**
     * 泛型方法
     * @param t
     * @param r
     * @param <T>
     * @param <R>
     */
    public<T,R> void fly(T t, R r){
        System.out.println(t.getClass());
        System.out.println(r.getClass());
    }
}

/**
 * 泛型类
 * @param <T>
 * @param <R>
 */
class Fish<T,R> {
    /**
     * 普通方法
     */
    public void run(){}

    /**
     * 泛型方法
     */
    public<U,M> void eat(U u, M m) {

    }

    /**
     *  下面hi方法不是泛型方法
     *  是hi使用了类声明的泛型
     */
    public void hi(T t) {

    }

    /**
     * 泛型方法, 可以使用类声明的泛型,也可以使用自己声明的泛型
     */
    public<A,B> void hello(A a, B b, R r){
        System.out.println(a.getClass());
        System.out.println(b.getClass());
        System.out.println(r.getClass());
    }
}

